home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / multifile.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  5KB  |  189 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. '''A readline()-style interface to the parts of a multipart message.
  5.  
  6. The MultiFile class makes each part of a multipart message "feel" like
  7. an ordinary file, as long as you use fp.readline().  Allows recursive
  8. use, for nested multipart messages.  Probably best used together
  9. with module mimetools.
  10.  
  11. Suggested use:
  12.  
  13. real_fp = open(...)
  14. fp = MultiFile(real_fp)
  15.  
  16. "read some lines from fp"
  17. fp.push(separator)
  18. while 1:
  19.         "read lines from fp until it returns an empty string" (A)
  20.         if not fp.next(): break
  21. fp.pop()
  22. "read remaining lines from fp until it returns an empty string"
  23.  
  24. The latter sequence may be used recursively at (A).
  25. It is also allowed to use multiple push()...pop() sequences.
  26.  
  27. If seekable is given as 0, the class code will not do the bookkeeping
  28. it normally attempts in order to make seeks relative to the beginning of the
  29. current file part.  This may be useful when using MultiFile with a non-
  30. seekable stream object.
  31. '''
  32. __all__ = [
  33.     'MultiFile',
  34.     'Error']
  35.  
  36. class Error(Exception):
  37.     pass
  38.  
  39.  
  40. class MultiFile:
  41.     seekable = 0
  42.     
  43.     def __init__(self, fp, seekable = 1):
  44.         self.fp = fp
  45.         self.stack = []
  46.         self.level = 0
  47.         self.last = 0
  48.         if seekable:
  49.             self.seekable = 1
  50.             self.start = self.fp.tell()
  51.             self.posstack = []
  52.         
  53.  
  54.     
  55.     def tell(self):
  56.         if self.level > 0:
  57.             return self.lastpos
  58.         
  59.         return self.fp.tell() - self.start
  60.  
  61.     
  62.     def seek(self, pos, whence = 0):
  63.         here = self.tell()
  64.         if whence:
  65.             if whence == 1:
  66.                 pos = pos + here
  67.             elif whence == 2:
  68.                 if self.level > 0:
  69.                     pos = pos + self.lastpos
  70.                 else:
  71.                     raise Error, "can't use whence=2 yet"
  72.             
  73.         
  74.         if (not None if pos <= pos else pos <= here or self.level > 0) and pos > self.lastpos:
  75.             raise Error, 'bad MultiFile.seek() call'
  76.         
  77.         self.fp.seek(pos + self.start)
  78.         self.level = 0
  79.         self.last = 0
  80.  
  81.     
  82.     def readline(self):
  83.         if self.level > 0:
  84.             return ''
  85.         
  86.         line = self.fp.readline()
  87.         if not line:
  88.             self.level = len(self.stack)
  89.             self.last = self.level > 0
  90.             if self.last:
  91.                 raise Error, 'sudden EOF in MultiFile.readline()'
  92.             
  93.             return ''
  94.         
  95.         if self.is_data(line):
  96.             return line
  97.         else:
  98.             marker = line.rstrip()
  99.         for i, sep in enumerate(reversed(self.stack)):
  100.             if marker == self.section_divider(sep):
  101.                 self.last = 0
  102.                 break
  103.                 continue
  104.             if marker == self.end_marker(sep):
  105.                 self.last = 1
  106.                 break
  107.                 continue
  108.         else:
  109.             return line
  110.         if self.seekable:
  111.             self.lastpos = self.tell() - len(line)
  112.         
  113.         self.level = i + 1
  114.         if self.level > 1:
  115.             raise Error, 'Missing endmarker in MultiFile.readline()'
  116.         
  117.         return ''
  118.  
  119.     
  120.     def readlines(self):
  121.         list = []
  122.         while None:
  123.             line = self.readline()
  124.             if not line:
  125.                 break
  126.             
  127.         return list
  128.  
  129.     
  130.     def read(self):
  131.         return ''.join(self.readlines())
  132.  
  133.     
  134.     def next(self):
  135.         while self.readline():
  136.             pass
  137.         if self.level > 1 or self.last:
  138.             return 0
  139.         
  140.         self.level = 0
  141.         self.last = 0
  142.         if self.seekable:
  143.             self.start = self.fp.tell()
  144.         
  145.         return 1
  146.  
  147.     
  148.     def push(self, sep):
  149.         if self.level > 0:
  150.             raise Error, 'bad MultiFile.push() call'
  151.         
  152.         self.stack.append(sep)
  153.         if self.seekable:
  154.             self.posstack.append(self.start)
  155.             self.start = self.fp.tell()
  156.         
  157.  
  158.     
  159.     def pop(self):
  160.         if self.stack == []:
  161.             raise Error, 'bad MultiFile.pop() call'
  162.         
  163.         if self.level <= 1:
  164.             self.last = 0
  165.         else:
  166.             abslastpos = self.lastpos + self.start
  167.         self.level = max(0, self.level - 1)
  168.         self.stack.pop()
  169.         if self.seekable:
  170.             self.start = self.posstack.pop()
  171.             if self.level > 0:
  172.                 self.lastpos = abslastpos - self.start
  173.             
  174.         
  175.  
  176.     
  177.     def is_data(self, line):
  178.         return line[:2] != '--'
  179.  
  180.     
  181.     def section_divider(self, str):
  182.         return '--' + str
  183.  
  184.     
  185.     def end_marker(self, str):
  186.         return '--' + str + '--'
  187.  
  188.  
  189.